#ifndef CRIMINISI_HPP
#define CRIMINISI_HPP

#include <string>

#include "Algorithm.hpp"

class Criminisi : virtual public Algorithm
{
protected:
  virtual int calculateWS(float confidence, float data, int windowSize);
  virtual float calculatePriority(float data_term, float conf_term);
  virtual void visualize(cv::Mat& image_padded,cv::Mat& mask_padded,int windowSize);

  virtual void precedure(cv::Mat& image_padded,cv::Mat& mask_padded);
  virtual void findCandidatePatch(cv::Mat& image_padded, cv::Mat& mask_padded, int i, int j, int windowSize, std::vector<std::pair<float, cv::Point2i>> &candidators);
  virtual cv::Point2i findBestPatch(cv::Mat& image_padded, cv::Mat& mask_padded, int i, int j, int windowSize, std::vector<std::pair<float, cv::Point2i>> &candidators, cv::Point2f dxdy);
  virtual void afterIteration(cv::Mat &image_padded, cv::Mat &mask_padded, cv::Mat &confidence_padded, cv::Mat &data_paddeed, int i, int j);

public:
  Criminisi();
  ~Criminisi();
};

#endif